package controller;

import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import javax.servlet.http.HttpSession;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/5/23 9:42
 * Version:1.0-SNAPSHOT
 * Description:
 */
@Controller
@SessionAttributes("user")
@RequestMapping("/session")
public class SessionController {

    @RequestMapping("/f1")
    public String f1(HttpSession session){
        User user = new User();
        user.setUsername("admin");
        session.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("f2")
    public void f2(HttpSession session){
        User user = (User) session.getAttribute("user");
        System.out.println(user.getUsername());
    }

    @RequestMapping("/f3")
    public String f3(User user){
        user.setUsername("alice");
        return "scope";
    }

    @RequestMapping("/f4")
    public String f4(User user){
        // 当方法的参数没有被@ModelAttribute注解所标注
        // 此时表示操作的是request作用域
        // 当request作用域没有数据时,会自动实例化一个新对象
        // 将新对象存放到request作用域
        // 最终会将request作用域中的数据备份
        // 存放到session作用域
        System.out.println(user);
        return "scope";
    }

    @RequestMapping("/f5")
    public String f5(@ModelAttribute User user){
        // 当方法的参数被@ModelAttribute标注之后
        // 表示当前参数操作的是session作用域
        // 当作用域中没有对应的数据时,会直接报错
        // Expected session attribute 'user'
        // 如果作用域中有数据了
        // 则最终会将session作用域的数据进行备份
        // 存放到request作用域中
        System.out.println(user);
        return "scope";
    }

    @RequestMapping("/f6")
    public String f6(HttpSession session){
        session.invalidate();
        return "scope";
    }


    @RequestMapping("/f7")
    public String f7(SessionStatus sessionStatus){
        // 清空session作用域
        // 不会清空request作用域
        sessionStatus.setComplete();
        return "scope";
    }

}
